package decorator_pattern;

/**
 * @author: 叶子
 * @date: 2022/02/28 10:26
 * 装饰器模式
 * 装饰器模式中的角色有4个
 * 组件接口/类(Component)、组件接口实现类(ConcreteComponent)、装饰器角色类(Decorator)、装饰器具体类(ConcreteDecorator)
 * 优点：不改动原有代码、动态增加功能；对象之间不会相互依赖，松耦合；符合开闭原则，扩展性好，便于维护
 * 缺点：装饰环节如果很多的话，会造成装饰器类膨胀，装饰器层层嵌套比较复杂，使用者必须清楚所有的装饰器类及用法
 * 使用：1. JDK中的IO流，inputStream 和FileInputStream是基本的组件接口和实现，
 *       bufferedInputStream、DataInputStream是不同的FilterInputStream的装饰实现
 *      2. 同步集合  Collection是组件，ArrayList是组件实现类
 *       SynchronizedCollection是装饰器角色，SynchronizedList是装饰器角色的具体类
 **/
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        WallBeauty wallBeautyClean  = new WallBeautyClean();
        wallBeautyClean.operation();//组件的实现类，只有清理墙面的功能
        System.out.println("----------");
        WallBeauty wallBeautyDecoratorPutty = new WallBeautyDecoratorPutty(wallBeautyClean);
        wallBeautyDecoratorPutty.operation();//刮腻子装饰器，在清理墙面的基础上增加了刮腻子功能
        System.out.println("----------");
        WallBeauty wallBeautyDecoratorPaint = new WallBeautyDecoratorPaint(wallBeautyClean);
        wallBeautyDecoratorPaint.operation();//涂油漆装饰器，在清理墙面的基础上增加了涂油漆的功能
        System.out.println("----------");
        WallBeauty wpp = new WallBeautyDecoratorPaint(new WallBeautyDecoratorPaint(new WallBeautyDecoratorPutty(wallBeautyClean)));
        wpp.operation();//嵌套，在清理墙面过后，先刮腻子，再涂两次油漆
    }
}